package com.wshoto.ocean.service.api.service.impl;

import com.wshoto.framework.common.constant.*;
import com.wshoto.framework.common.exception.remote.database.*;
import com.wshoto.ocean.service.api.service.*;
import com.wshoto.ocean.service.common.bo.*;
import com.wshoto.ocean.service.common.request.*;
import com.wshoto.ocean.service.common.service.*;
import com.wshoto.ocean.service.dao.entity.*;
import lombok.extern.slf4j.*;
import org.apache.commons.lang3.*;
import org.slf4j.*;
import org.springframework.beans.*;
import org.springframework.stereotype.*;

import javax.annotation.*;
import java.util.*;
import java.util.stream.*;

/**
 * 示例Service实现,用于承载处理Api层业务逻辑
 * 命名规范遵循大驼峰式命名，命名规则为 业务名+Service+Impl
 *
 * @author Lee
 */
@Slf4j
@Service
public class AppServiceImpl implements AppService {

    private Logger EVENT_LOGGER = LoggerFactory.getLogger(CommonConstant.EVENT_LOGGER);

    /**
     * 通用CRUD逻辑,使用该方法，Mapper命名需严格遵循指定定规范，即：实体对象名+Mapper
     */
    @Resource
    private SimpleGenericDataBaseService simpleGenericDataBaseService;

    @Override
    public void appRegister(AppRegisterReq appRegisterReq) {
        try {
            AppInfo entity = new AppInfo();
            BeanUtils.copyProperties(appRegisterReq, entity);
            simpleGenericDataBaseService.save(entity);
        } catch (Exception e) {
            //
            /*
            日志输出规范示例
            日志拼接使用占位符
            若有异常信息，需要将完整的异常实例传递进来，不要只打印异常中的message信息
             */
            log.error("{}用户信息保存失败", appRegisterReq.getAppName(), e);
            /*
            自定义异常转换示例，该异常传入的Message信息可直接作为前端提示消息使用
            上层调用此方法时，如无特殊处理，直controller层都不必再次捕获该异常，全局异常拦截会自行处理
            如无必要尽量不要自及传入状态码，每个自定义异常中都有固定对应的状态码
            若如此类情况的异常转换，一定要将上级异常传入当前自定义异常，以保证异常链路不被中断
             */
            throw new DatabaseServiceErrorException("保存失败", e);
        }
    }

    @Override
    public List<AppInfoBO> getApps(AppReq appReq) {
        AppInfo appInfo = new AppInfo();
        BeanUtils.copyProperties(appReq, appInfo);
        return Optional.ofNullable(simpleGenericDataBaseService.list(appInfo))
                .orElseGet(() -> new ArrayList<>())
                .stream().map(
                        obj -> {
                            AppInfoBO ret = new AppInfoBO();
                            BeanUtils.copyProperties(obj, ret);
                            return ret;
                        }
                ).collect(Collectors.toList());
    }

    @Override
    public AppInfoBO getAppById(Long id) {
        AppInfo info = simpleGenericDataBaseService.getById(id, AppInfo.class);
        if (ObjectUtils.isEmpty(info)) {
            return null;
        }
        AppInfoBO ret = new AppInfoBO();
        BeanUtils.copyProperties(info, ret);
        return ret;
    }

    @Override
    public void deleteApp(Long id) {
        simpleGenericDataBaseService.deleteById(id, AppInfo.class);
    }


}
